日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

1244. Gentlemen

發布時間:2025/7/25 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1244. Gentlemen 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://acm.timus.ru/problem.aspx?space=1&num=1244

背包題? 理解并不難

主要在于如果答案有多個要輸出 -1

一個答案的話要輸出結果?? 否則輸出 0

用 sum [ n ] 表示到 n 有幾條路徑

狀態轉移方程為?

if(sum[j-a[i]])//a[i]表示第i個數據的大小

{
??????? sum[j]=max(sum[j]+1,sum[j-a[i]]);

}

代碼及其注釋:

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm>#define LL long longusing namespace std;const int N=100003; int sum[N];//到 N 有幾條路徑 int f[N];// 記錄第一次到此用了那個數據 int a[103];// 數據大小 bool select[103];//是否用了 void Fselect(int x)//記錄用了哪幾個數據 {while(x){select[f[x]]=true;x=x-a[f[x]];} } int main() {//freopen("data.txt","r",stdin);int K,n;while(scanf("%d %d",&K,&n)!=EOF){memset(sum,0,sizeof(sum));sum[0]=1;memset(select,false,sizeof(select));int m=0;for(int i=1;i<=n;++i){scanf("%d",&a[i]);if(sum[K]>1)//如果答案有多個 則無需再找continue;m=min(m+a[i],K);//最大for(int j=m;j>=a[i];--j){if(sum[j]==0)//如果是求得第一條到此路徑 記錄用了哪一數據{f[j]=i;}if(sum[j-a[i]])//更新到此路徑數目{sum[j]=max(sum[j]+1,sum[j-a[i]]);}}if(sum[K]==1)Fselect(K);}if(sum[K]==0){printf("0\n");continue;}if(sum[K]>1){printf("-1\n");continue;}for(int i=1;i<=n;++i){if(!select[i])printf("%d ",i);}printf("\n");}return 0; }

?

轉載于:https://www.cnblogs.com/liulangye/archive/2012/09/12/2682017.html

總結

以上是生活随笔為你收集整理的1244. Gentlemen的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。