日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1244. Gentlemen

發布時間:2025/7/25 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

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